Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - [VB.NET] Risorse sistema insufficienti
Forum - C# / VB.NET - [VB.NET] Risorse sistema insufficienti

Avatar
ACecere (Normal User)
Newbie


Messaggi: 6
Iscritto: 24/02/2014

Segnala al moderatore
Postato alle 12:17
Lunedì, 24/02/2014
Salve a tutti,
è da qualche settimana che combatto con questo errore ed , essendo ormai sfiduciato, mi rivolgo a voi :hail:
In pratica,  dopo circa 2 ore di esecuzione, mi si presenta l'errore "Risorse di sistema insufficienti"..

Il codice è il seguente :

Codice sorgente - presumibilmente VB.NET

  1. Public Sub Lettura_Dati()
  2.         Dim Database As String = INIRead("C:\Config.ini", "Percorsi", "ConnectionString") + INIRead("C:\Config.ini", "Percorsi", "NomeDB")
  3.         Dim Query, Query2 As String
  4.         Dim Cn As New OleDbConnection(Database)
  5.         Cn.Open()
  6.         Query = "Select Descrizione from Articoli group by Genere"
  7.         Dim Conn As New OleDb.OleDbCommand(Query, Cn)
  8.         Dim Rs As OleDb.OleDbDataReader = Conn.ExecuteReader()
  9.         While Rs.Read
  10.             '############ TESTATE CAMPIONATO
  11.             text2.text = Rs("Descrizione")
  12.             Query2 = "Select Stato from Articoli Where Descrizione like '" & Rs("Descrizione") & "'"
  13.             Dim Conn2 As New OleDb.OleDbCommand(Query2, Cn)
  14.             Dim rs2 As OleDbDataReader = Conn2.ExecuteReader
  15.             While rs2.Read
  16.                 '################################ INCONTRI
  17.                 text1.text = rs2("Stato")
  18.             End While
  19.             rs2.Close()
  20.             rs2 = Nothing
  21.             Conn2.Dispose()
  22.         End While
  23.         Rs.Close()
  24.         Rs = Nothing
  25.         Cn.Dispose()
  26.         Conn.Dispose()
  27.     End Sub



L'errore me lo segnala sull'istruzione

Codice sorgente - presumibilmente C# / VB.NET

  1. Dim rs2 As OleDbDataReader = Conn2.ExecuteReader



Potreste aiutarmi a capire cosa c'è di errato nel codice ? :hail:

Grazie anticipatamente!

PM Quote
Avatar
Snogar (Normal User)
Pro


Messaggi: 145
Iscritto: 09/01/2012

Segnala al moderatore
Postato alle 12:26
Lunedì, 24/02/2014
prova a mettere un blocco try e metti le chiusure degli elementi del database nel finaly tanto per iniziare.

pio la conn2 la distruggi ad ogni ciclo while  ....non ne capisco il senso :-?

PM Quote
Avatar
ACecere (Normal User)
Newbie


Messaggi: 6
Iscritto: 24/02/2014

Segnala al moderatore
Postato alle 12:44
Lunedì, 24/02/2014
pensi che così vada meglio ?

Codice sorgente - presumibilmente VB.NET

  1. Dim Database As String = INIRead("C:\Config.ini", "Percorsi", "ConnectionString") + INIRead("C:\Config.ini", "Percorsi", "NomeDB")
  2.         Dim Query, Query2 As String
  3.         Dim Cn As New OleDbConnection(Database)
  4.         Cn.Open()
  5.         Query = "Select Descrizione from Articoli group by Genere"
  6.         Dim Conn As New OleDb.OleDbCommand(Query, Cn)
  7.         Try
  8.             Dim Rs As OleDb.OleDbDataReader = Conn.ExecuteReader()
  9.             While Rs.Read
  10.                 text2.text = Rs("Descrizione")
  11.                 Query2 = "Select Stato from Articoli Where Descrizione like '" & Rs("Descrizione") & "'"
  12.                 Dim Conn2 As New OleDb.OleDbCommand(Query2, Cn)
  13.                 Dim rs2 As OleDbDataReader = Conn2.ExecuteReader
  14.  
  15.                 While rs2.Read
  16.                     text1.text = rs2("Stato")
  17.                 End While
  18.  
  19.                 rs2.Close()
  20.                 rs2 = Nothing
  21.             End While
  22.         Catch es As Exception
  23.             My.Computer.FileSystem.WriteAllText("C:\Log.txt", "Errore", True)
  24.         Finally
  25.             Rs.Close()
  26.             Rs = Nothing
  27.             Cn.Dispose()
  28.             Conn.Dispose()
  29.             Conn2.Dispose()
  30.         End Try


PM Quote
Avatar
Ultimo (Member)
Guru


Messaggi: 880
Iscritto: 22/05/2010

Segnala al moderatore
Postato alle 16:07
Mercoledì, 26/02/2014

Risorse di sistema insuficenti = Mamma dammi i soldi che devo comprare altra RAM


If ok Then GOTO Avanza else GOTO Inizia

PM Quote
Avatar
ACecere (Normal User)
Newbie


Messaggi: 6
Iscritto: 24/02/2014

Segnala al moderatore
Postato alle 14:22
Giovedì, 27/02/2014
16 Gb penso che bastino.. o no ?;)

PM Quote
Avatar
Qwertj (Dev Team)
Guru


Messaggi: 678
Iscritto: 30/05/2011

Segnala al moderatore
Postato alle 16:52
Giovedì, 27/02/2014
Testo quotato

Postato originariamente da Ultimo:


Risorse di sistema insuficenti = Mamma dammi i soldi che devo comprare altra RAM  



O come buttare via i soldi spegnendo il cervello :_doubt:

Codice sorgente - presumibilmente VB.NET

  1. While Rs.Read
  2.     text2.text = Rs("Descrizione")
  3.     Query2 = "Select Stato from Articoli Where Descrizione like '" & Rs("Descrizione") & "'"
  4.     Dim Conn2 As New OleDb.OleDbCommand(Query2, Cn)
  5.     Dim rs2 As OleDbDataReader = Conn2.ExecuteReader
  6.  
  7.     While rs2.Read
  8.         text1.text = rs2("Stato")
  9.     End While
  10.  
  11.     rs2.Close()
  12.     rs2 = Nothing
  13. End While


Allocare memoria in un ciclo, specialmente se si ripete così a lungo, è una PESSIMA pratica. :nono:

Se sei fortunato hai la GC che sputa sangue e un bel 200x di moltiplicatore sul tempo di esecuzione, se sei sfortunato (come nel tuo caso) finisci bellamente lo spazio in memoria.

Prova una cosa così
Codice sorgente - presumibilmente VB.NET

  1. Dim Database As String = INIRead("C:\Config.ini", "Percorsi", "ConnectionString") + INIRead("C:\Config.ini", "Percorsi", "NomeDB")
  2. 'Query1 e Query2 sono inutili
  3. Dim Cn As New OleDbConnection(Database)
  4. Cn.Open()
  5. Dim Conn As New OleDb.OleDbCommand("Select Descrizione from Articoli group by Genere", Cn)
  6.  
  7. Try
  8.        
  9.         Dim Rs As OleDb.OleDbDataReader = Conn.ExecuteReader()
  10.         Dim Conn2 As New OleDb.OleDbCommand() 'istanziato >una volta sola<
  11.         Dim rs2 As OleDbDataReader
  12.         Conn2.Connection = Cn
  13.        
  14.         While Rs.Read()
  15.                 Try
  16.                         text2.text = Rs("Descrizione")
  17.                         'sovrascrivo semplicemente la query senza creare un nuovo oggetto ogni volta
  18.                         Conn2.CommandText = "Select Stato from Articoli Where Descrizione like '" & Rs("Descrizione") & "'"
  19.                         rs2 = Conn2.ExecuteReader()
  20.  
  21.                         While rs2.Read()
  22.                                 text1.text = rs2("Stato")
  23.                         End While
  24.                        
  25.                 Catch es As OutOfMemoryException
  26.                         GC.Collect() 'liberiamo un po' di memoria, se ce n'è avanzata...
  27.                         My.Computer.FileSystem.WriteAllText("C:\Log.txt", "Warning: memory leak", True)
  28.                 Finally
  29.                         rs2.Close()
  30.                         rs2.Dispose() 'perchè lui niente dispose?
  31.                 End Try
  32.         End While
  33.        
  34. Catch es As Exception
  35.         'io aggiungerei qualcosa di descrittivo... tipo es.Message
  36.         My.Computer.FileSystem.WriteAllText("C:\Log.txt", "Errore", True)
  37. Finally
  38.         Rs.Close()
  39.         Rs.Dispose() 'anche lui si merita un dispose
  40.         Cn.Dispose()
  41.         Conn.Dispose()
  42.         Conn2.Dispose()
  43. End Try


Questo dovrebbe ottimizzare il codice. Nota i Dispose() anche dove avevi i "= Nothing" e il non avere più nulla dichiarato dentro i cicli!
Inoltre Conn2 viene istanziato una volta sola e non a ogni iterazione, mangiandoti risorse a manetta

Sicuramente si può ottimizzare anche a livello algoritmico (tipo fare un'unica query?) ma non sapendo il funzionamento del programma mi riservo di lasciare a te questa parte.

Pensate mentre scrivete il codice! :rofl:

PM Quote
Avatar
vankraster (Member)
Rookie


Messaggi: 32
Iscritto: 05/11/2010

Segnala al moderatore
Postato alle 12:09
Venerdì, 28/02/2014
[PseudoCodice] - Io uso C#
Io in genere faccio diversamente, l'idea non è quella di fare una query all'interno di ogni ciclo che ti succhia troppe risorse, ma:
riempire un datatable con tutti i valori con :
Datatable DT_RES= EseguiQuery(" Select Stato, Descrizione from Articoli");
Poi dentro il ciclo fai
DT_RES.Select("Descrizione like '"+ Rs("Descrizione") +"'" ) che ti restituisce un'array di datarow.
puoi fare comunque un :
foreach (datarow riga in DT_RES.Select("Descrizione like '%"+ Rs("Descrizione") +"%'" ))

Non ho tempo di  buttarti giù il codice, sono al lavoro ma la strada dovrebbe essere questa, e prova a usare gli using senza fare il manual dispose.
fai  
Using Cn As New OleDbConnection(Database)
  .....  
End Using
e non c'è bisogno del dispose.

Ultima modifica effettuata da vankraster il 28/02/2014 alle 12:10
PM Quote
Avatar
ACecere (Normal User)
Newbie


Messaggi: 6
Iscritto: 24/02/2014

Segnala al moderatore
Postato alle 12:24
Martedì, 04/03/2014
Grazie Mille a tutti!

Ho risolto seguendo il consiglio di Qwertj :k:

PM Quote
Avatar
ACecere (Normal User)
Newbie


Messaggi: 6
Iscritto: 24/02/2014

Segnala al moderatore
Postato alle 12:34
Martedì, 04/03/2014
Grazie Mille a tutti!

Ho risolto seguendo il consiglio di Qwertj :k:

PM Quote